{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "53130f7e",
   "metadata": {},
   "source": [
    "## 窗函数法设计FIR数字滤波器"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3f9f101a",
   "metadata": {},
   "source": [
    "窗函数设计法也称傅里叶级数法，出发点是从时域开始，用窗函数截取理想的$h_d(n)$得$h(n)$，以有限长$h(n)$近似理想的$h_d(n)$，这样得到的频率响应$H(e^{jw})$，逼近于理想的频响$H_d(e^{jw})$ ，完成FIR数字滤波器的设计"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2e993b4b",
   "metadata": {},
   "source": [
    "- 案例一：用窗函数法设计一个$h(n)$偶对称的线性相位FIR低通滤波器，给定通带截止频率$w_p=0.3\\pi$，阻带截止频率为 $w_st=0.5\\pi$，阻带衰减为$A_s=40dB$。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "400540aa",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#导入使用的库\n",
    "import numpy as np;from math import *\n",
    "from scipy import signal,fft\n",
    "import matplotlib.pyplot as plt\n",
    "from matplotlib.ticker import MaxNLocator\n",
    "\n",
    "#滤波器参数\n",
    "wp = 0.3*pi;ws = 0.5*pi; #通带和阻带截止频率\n",
    "wc = (wp+ws)/2;Bt = np.abs(wp-ws) #截止频率和过渡带宽\n",
    "\n",
    "#由阻带衰减As = 40，可以确定窗形状为汉宁窗\n",
    "N = np.ceil((6.6*pi)/Bt)+1;N = int(N+(N+1)%2)#滤波器长度点数（取奇数）\n",
    "wn = signal.windows.hann(N) #汉宁窗的wn值\n",
    "\n",
    "#理想低通滤波器的单位取样响应\n",
    "t = int((N-1)/2)\n",
    "n1 = np.arange(N);n1 = np.delete(n1,t)\n",
    "hd = np.sin(wc*(n1-t))/(pi*(n1-t))\n",
    "hd = np.insert(hd,t,wc/pi)\n",
    "\n",
    "#线性相位FIR滤波器\n",
    "h = hd*wn;N0 = N*1000\n",
    "He = np.abs(fft.fft(h,N0));He = He/np.max(He)\n",
    "Ar = 20*np.log10(He);N1 = int(N0/2)\n",
    "f = np.linspace(0,1,N1)\n",
    "\n",
    "#绘制滤波器的幅度响应\n",
    "fig,ax = plt.subplots();ax.plot(f,Ar[:N1]);ax.grid()\n",
    "ax.set_title('使用汉宁窗设计的FIR滤波器的幅度响应');ax.set_xlabel('k')\n",
    "ax.set_xlabel(r'$ \\omega / \\pi $')\n",
    "ax.set_ylabel(r'$ 20log_{10}| H (e^{j \\omega}) | $')\n",
    "ax.set_xlim([0,1]);\n",
    "#ax.set_f([-100,1])\n",
    "ax.xaxis.set_major_locator(MaxNLocator(11))\n",
    "ax.yaxis.set_major_locator(MaxNLocator(11))\n",
    "plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签\n",
    "plt.rcParams['axes.unicode_minus'] = False #用来显示负号\n",
    "fig.savefig('./fir_window1.png',dpi=500)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3031de81",
   "metadata": {},
   "source": [
    "- 案例二：用窗函数法设计一个$h(n)$偶对称的线性相位FIR高通滤波器，给定通带截止频率$w_p=0.4\\pi$，阻带截止频率为$w_st=0.2\\pi$，阻带衰减为$A_s=50dB$。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "0f62d8d8",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#导入使用的库\n",
    "import numpy as np;from math import *\n",
    "from scipy import signal,fft\n",
    "import matplotlib.pyplot as plt\n",
    "from matplotlib.ticker import MaxNLocator\n",
    "\n",
    "#滤波器参数\n",
    "wp = 0.4*pi;ws = 0.2*pi; #通带和阻带截止频率\n",
    "wc = (wp+ws)/2;Bt = np.abs(wp-ws) #截止频率和过渡带宽\n",
    "\n",
    "#由阻带衰减As = 40，可以确定窗形状为海明窗\n",
    "N = np.ceil((6.6*pi)/Bt)+1;N = int(N+(N+1)%2)#滤波器长度点数（取奇数）\n",
    "wn = signal.windows.hamming(N) #汉宁窗的wn值\n",
    "\n",
    "#理想低通滤波器的单位取样响应\n",
    "t = int((N-1)/2)\n",
    "n1 = np.arange(N);n1 = np.delete(n1,t)\n",
    "hd = -np.sin(wc*(n1-t))/(pi*(n1-t))\n",
    "hd = np.insert(hd,t,(1-wc/pi))\n",
    "\n",
    "#线性相位FIR滤波器\n",
    "h = hd*wn;N0 = N*1000\n",
    "He = np.abs(fft.fft(h,N0));He = He/np.max(He)\n",
    "Ar = 20*np.log10(He);N1 = int(N0/2)\n",
    "f = np.linspace(0,1,N1)\n",
    "\n",
    "#绘制滤波器的幅度响应\n",
    "fig,ax = plt.subplots();ax.plot(f,Ar[:N1]);ax.grid()\n",
    "ax.set_title('使用海明窗设计的FIR滤波器的幅度响应');ax.set_xlabel('k')\n",
    "ax.set_xlabel(r'$ \\omega / \\pi $')\n",
    "ax.set_ylabel(r'$ 20log_{10}| H (e^{j \\omega}) | $')\n",
    "ax.set_xlim([0,1]);ax.set_ylim([-100,1])\n",
    "ax.xaxis.set_major_locator(MaxNLocator(11))\n",
    "ax.yaxis.set_major_locator(MaxNLocator(11))\n",
    "plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签\n",
    "plt.rcParams['axes.unicode_minus'] = False #用来显示负号\n",
    "fig.savefig('./fir_window1.png',dpi=500)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a5eb3ed0",
   "metadata": {},
   "source": [
    "- 案例三：用窗函数法设计一个$h(n)$偶对称的线性相位FIR带通滤波器，给定下阻带截止频率$f_{st_1}=2kHz$，上阻带截止频率$f_{st_2}=6kHz$，通带下截止频率为$f_{p_1}=3kHz$，通带上截止频率为$f_{p_2}=5kHz$，阻带最小衰减为$A_s=55dB$，抽样频率为$f_s=20kHz$。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "bc639c17",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#导入使用的库\n",
    "import numpy as np;from math import *\n",
    "from scipy import signal,fft\n",
    "import matplotlib.pyplot as plt\n",
    "from matplotlib.ticker import MaxNLocator\n",
    "\n",
    "#滤波器参数\n",
    "fs = 20000; #抽样频率\n",
    "wp1 = 2*pi*3000/fs;wp2 = 2*pi*5000/fs #通带截止频率\n",
    "ws1 = 2*pi*2000/fs;ws2 = 2*pi*6000/fs #阻带截止频率\n",
    "w1 = (wp1+ws1)/2;w2 = (wp2+ws2)/2 \n",
    "Bt = np.array([np.abs(wp1-ws1),np.abs(wp2-ws2)]);Bt = Bt.min() #过渡带宽\n",
    "\n",
    "#由阻带衰减As = 55，可以确定窗形状为布拉克曼窗\n",
    "N = np.ceil((11*pi)/Bt)+1;N = int(N+(N+1)%2)#滤波器长度点数（取奇数）\n",
    "wn = signal.windows.blackman(N) #汉宁窗的wn值\n",
    "\n",
    "#理想低通滤波器的单位取样响应\n",
    "t = int((N-1)/2)\n",
    "n1 = np.arange(N);n1 = np.delete(n1,t)\n",
    "hd = (np.sin(w2*(n1-t))-np.sin(w1*(n1-t)))/(pi*(n1-t))\n",
    "hd = np.insert(hd,t,(w2-w1)/pi)\n",
    "\n",
    "#线性相位FIR滤波器\n",
    "h = hd*wn;N0 = N*1000\n",
    "He = np.abs(fft.fft(h,N0));He = He/np.max(He)\n",
    "Ar = 20*np.log10(He);N1 = int(N0/2);f = np.linspace(0,1,N1)\n",
    "\n",
    "#绘制滤波器的幅度响应\n",
    "fig,ax = plt.subplots();ax.plot(f,Ar[:N1]);ax.grid()\n",
    "ax.set_title('使用布拉克曼窗设计的FIR滤波器的幅度响应');ax.set_xlabel('k')\n",
    "ax.set_xlabel(r'$ \\omega / \\pi $')\n",
    "ax.set_ylabel(r'$ 20log_{10}| H (e^{j \\omega}) | $')\n",
    "ax.set_xlim([0,1]);ax.set_ylim([-100,1])\n",
    "ax.xaxis.set_major_locator(MaxNLocator(11))\n",
    "ax.yaxis.set_major_locator(MaxNLocator(11))\n",
    "plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签\n",
    "plt.rcParams['axes.unicode_minus'] = False #用来显示负号\n",
    "fig.savefig('./fir_window2.png',dpi=500)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9c9b8b3f",
   "metadata": {},
   "source": [
    "- 案例四：用窗函数法设计一个$h(n)$偶对称的线性相位FIR带阻滤波器，给定阻带下截止频率$f_{st_1}=40Hz$，阻带上截止频率$f_{st_2}=60Hz$，下通带截止频率为$f_{p_1}=15Hz$，上通带截止频率为$f_{p_2}=80Hz$，阻带最小衰减为$A_s=50dB$，抽样频率为$f_s=250Hz$。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "d685e734",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#导入使用的库\n",
    "import numpy as np;from math import *\n",
    "from scipy import signal,fft\n",
    "import matplotlib.pyplot as plt\n",
    "from matplotlib.ticker import MaxNLocator\n",
    "\n",
    "#滤波器参数\n",
    "fs = 250; #抽样频率\n",
    "wp1 = 2*pi*15/fs;wp2 = 2*pi*80/fs #通带截止频率\n",
    "ws1 = 2*pi*40/fs;ws2 = 2*pi*60/fs #阻带截止频率\n",
    "w1 = (wp1+ws1)/2;w2 = (wp2+ws2)/2 \n",
    "Bt = np.array([np.abs(wp1-ws1),np.abs(wp2-ws2)]);Bt = Bt.min() #过渡带宽\n",
    "\n",
    "#由阻带衰减As = 50，可以确定窗形状为海明窗\n",
    "N = np.ceil((6.6*pi)/Bt)+1;N = int(N+(N+1)%2)#滤波器长度点数（取奇数）\n",
    "wn = signal.windows.hamming(N) #汉宁窗的wn值\n",
    "\n",
    "#理想低通滤波器的单位取样响应\n",
    "t = int((N-1)/2)\n",
    "n1 = np.arange(N);n1 = np.delete(n1,t)\n",
    "hd = (np.sin(pi*(n1-t))-np.sin(w2*(n1-t))+np.sin(w1*(n1-t)))/(pi*(n1-t))\n",
    "hd = np.insert(hd,t,(1-((w2-w1)/pi)))\n",
    "\n",
    "#线性相位FIR滤波器\n",
    "h = hd*wn;N0 = N*1000\n",
    "He = np.abs(fft.fft(h,N0));He = He/np.max(He)\n",
    "Ar = 20*np.log10(He);N1 = int(N0/2);f = np.linspace(0,1,N1)\n",
    "\n",
    "#绘制滤波器的幅度响应\n",
    "fig,ax = plt.subplots();ax.plot(f,Ar[:N1]);ax.grid()\n",
    "ax.set_title('使用海明窗设计的FIR滤波器的幅度响应');ax.set_xlabel('k')\n",
    "ax.set_xlabel(r'$ \\omega / \\pi $')\n",
    "ax.set_ylabel(r'$ 20log_{10}| H (e^{j \\omega}) | $')\n",
    "ax.set_xlim([0,1]);ax.set_ylim([-100,1])\n",
    "ax.xaxis.set_major_locator(MaxNLocator(11))\n",
    "ax.yaxis.set_major_locator(MaxNLocator(11))\n",
    "plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签\n",
    "plt.rcParams['axes.unicode_minus'] = False #用来显示负号\n",
    "fig.savefig('./fir_window4.png',dpi=500)\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
